checkout: fchown symlink to proper uid/gid
authorAlexander Larsson <alexl@redhat.com>
Thu, 4 Dec 2014 19:19:09 +0000 (20:19 +0100)
committerAlexander Larsson <alexl@redhat.com>
Thu, 4 Dec 2014 19:30:10 +0000 (20:30 +0100)
When commiting a symlink we do store the uid/gid of the actual
symlink (i.e. not target). However, this was not restored
on non-user-mode checkout as it should.

This commit fixes that, and additionally it ensures xattrs
on symlinks are not set in user-mode checkout.

https://bugzilla.gnome.org/show_bug.cgi?id=741125

src/libostree/ostree-repo-checkout.c

index 03efd601a8fa04e784988eb5c908f95b2b6cdf32..29243d51c36ccab70568b448cf6635a3901d7ef9 100644 (file)
@@ -189,12 +189,24 @@ checkout_file_from_input_at (OstreeRepoCheckoutMode mode,
           ot_util_set_error_from_errno (error, errno);
           goto out;
         }
-          
-      if (xattrs)
+
+      if (mode != OSTREE_REPO_CHECKOUT_MODE_USER)
         {
-          if (!gs_dfd_and_name_set_all_xattrs (destination_dfd, destination_name,
-                                               xattrs, cancellable, error))
-            goto out;
+          if (G_UNLIKELY (fchownat (destination_dfd, destination_name,
+                                    g_file_info_get_attribute_uint32 (file_info, "unix::uid"),
+                                    g_file_info_get_attribute_uint32 (file_info, "unix::gid"),
+                                    AT_SYMLINK_NOFOLLOW) == -1))
+            {
+              ot_util_set_error_from_errno (error, errno);
+              goto out;
+            }
+
+          if (xattrs)
+            {
+              if (!gs_dfd_and_name_set_all_xattrs (destination_dfd, destination_name,
+                                                   xattrs, cancellable, error))
+                goto out;
+            }
         }
     }
   else if (g_file_info_get_file_type (file_info) == G_FILE_TYPE_REGULAR)